//
// Created by jsz on 2021/6/10.
//

#ifndef FAKEDEVICE_PROTOCOL_H
#define FAKEDEVICE_PROTOCOL_H

#define MAX_FRAME_LEN   1024
#define MAX_FRAME_PAIR  20

typedef struct {
    int req_len;
    char req[MAX_FRAME_LEN];
    int resp_len;
    char resp[MAX_FRAME_LEN];
} frame_pair_t;

// 解析文件，获得frame_pair
typedef int (*parse_func)(int fd, frame_pair_t **p_frame_pair, int *num_p_pair, frame_pair_t **a_frame_pair, int *num_a_pair);

// 从请求获得对应相应
typedef int (*get_resp_func)(void *req, int req_size, void *resp, int max_resp_size, void *priv_data);

// 查询下一主动发的请求
typedef int (*get_next_req_func)(void *req, int max_output_size, void *priv_data);

// 检查收到的应答是否正确
typedef int (*is_valid_resp_func)(void *resp, int resp_size, void *priv_data);

//
//typedef struct {
//    get_resp_func get_resp;     //
//    get_next_req_func get_next_req;
//    is_valid_resp_func is_valid_resp;
//} protocol_func_t;

typedef struct {
    const char *name;       // 协议名
    int next_req_idx;           // 下一请求
    int total_p_pair;             // 总帧数
    frame_pair_t p_frame_pair[MAX_FRAME_PAIR];   // 存储的帧对
    int total_a_pair;             // 总帧数
    frame_pair_t a_frame_pair[MAX_FRAME_PAIR];   // 存储的帧对
    get_resp_func get_resp;     //
    get_next_req_func get_next_req;
    is_valid_resp_func is_valid_resp;
} protocol_resolver_t;

// 默认报文文件解析函数
int default_parse_func(int fd, frame_pair_t *p_frame_pair, int *num_p_pair, frame_pair_t *a_frame_pair, int *num_a_pair);

// 打印帧序列
void print_frame(const char *desc, char *frame, int frame_len);

// 初始化
protocol_resolver_t *protocol_init(const char *proto_name);

// 销毁
void protocol_destroy(protocol_resolver_t *resolver);

#endif//FAKEDEVICE_PROTOCOL_H
